package com.sziit.se.highconcurrency.tool;

import com.sziit.se.highconcurrency.security.CurrentUserInfo;
import org.springframework.util.Assert;
import org.springframework.util.DigestUtils;

import java.util.Base64;

public class EncodeUtils {
    private static final String salt = "*#&%$^";

    /**
     * MD5加密
     *
     * @param str 待加密字符串
     * @return 加密后的字符串
     */
    public static String generateMD5(String str) {
        return DigestUtils.md5DigestAsHex(str.getBytes());
    }

    /**
     * MD5盐值加密
     *
     * @param str 待加密字符串
     * @return 加密后的字符串
     */
    public static String generateSaltMD5(String str) {
        String base = str + "/" + salt;
        return DigestUtils.md5DigestAsHex(base.getBytes());
    }

    /**
     * 转Base64编码
     *
     * @param str 待编码字符串
     * @return 编码结果
     */
    public static String generateBase64(String str) {
        return Base64.getEncoder().encodeToString(str.getBytes());
    }

    /**
     * Base64解码
     *
     * @param str 待解码字符串
     * @return 解码结果
     */
    public static String base64Decode(String str) {
        return new String(Base64.getDecoder().decode(str));
    }

    /**
     * 生成token
     *
     * @param userId     用户id
     * @param clientType token类型 如用户或管理员
     * @return token
     */
    public static String generateToken(Long userId, Integer clientType) {
        String id = String.valueOf(userId);
        String token = generateSaltMD5(id + System.currentTimeMillis());
        String client = String.valueOf(clientType);
        return client + "-" + generateBase64(id) + "." + generateBase64(token);
    }

    /**
     * 解析token获取用户信息
     *
     * @param token token
     * @return 当前用户信息
     */
    public static CurrentUserInfo tokenDecode(String token) {
        Assert.notNull(token, "token为空");
        String[] strings = token.split("[-.]");
        CurrentUserInfo userInfo = new CurrentUserInfo();
        userInfo.setClientType(Integer.parseInt(strings[0]));
        userInfo.setUserId(Long.valueOf(base64Decode(strings[1])));
        return userInfo;
    }

    /**
     * 密码使用MD5盐值加密
     *
     * @param password 密码
     * @return 加密后的密码
     */
    public static String generatePassword(String password) {
        Assert.notNull(password, "密码为空");
        return generateSaltMD5(password);
    }
}
